from genericpath import isdir
import os
"""
1. 扫描文件夹下面的目录文件
    - 文件类型筛选
2.找出当前关键字所在的文件名称和路径
    - 多关键字
3.输出到txt中记录
"""
# 代码存放的路径
base_code_path=u'/Users/tim/Documents/java/code/ww/'
out_data_file_name=base_code_path+'data.txt'
# 需要扫描的工程包
project_names=[]
# 需要扫描的文件类型
file_type=['.xml','.java']
# 忽略文件夹，或者文件
gnore_files=['.git','.idea','.settings','logs','target','log.path_IS_UNDEFINED','pom.xml']
# 关键字
search_key=[]
# 保存查询出的数据
""""
{
    'key':{
        "file_name":[
            "value"
        ]
    }
}

"""
search_key_data={}

def recursion_project(file_path):
    files=os.listdir(file_path)
    print("当前文件夹：{0} 长度:{1}".format(file_path,len(files)))
    for file in files:
        file_d = os.path.join(file_path,file)
        # 如果是忽略文件或者文件夹则不去搜索
        if is_gnore_files(file):
            continue
        if os.path.isdir(file_d):
            recursion_project(file_d)
        else:
            filename,type=os.path.splitext(file)
            if is_file_type(type):
                # print("文件：{}".format(file))
                read_line_number(search_key,file_d)
# 关键字查找文件数据
def read_line_number(search_key,file_d):
    f = open(file_d,"r")
    lines = f.readlines() 
    index_num=1
    for line in lines:
        line_str=line.replace('\n','')
        for key in search_key:
            if line_str.find(key)>-1:
                obj_data={}
                str_value="- 关键字{0},{1}行：{2}".format(key,index_num,line_str)
                print(str_value)
                obj_data['key']=key
                obj_data['file']=file_d
                obj_data['str_value']=str_value
                insert_data_log(key,file_d,str_value)
        index_num=index_num+1
# 按照格式插入数据
def insert_data_log(key,file,str_value):
    global search_key_data
    init_value(search_key_data,key,{})
    obj=search_key_data[key]
    init_value(obj,file,[])
    value_list=obj[file]
    value_list.append(str_value)

def init_value(obj,key,init_data):
    item_obj=obj.get(key)
    if item_obj is None:
        obj[key]=init_data
# 获取文件相对路径
def get_file_abs_path(file_d):
    file_d=file_d.replace(base_code_path,'')
    print("文件相对路径：{0}".format(file_d))
    return file_d
# 判断是否为忽略的文件或者文件夹
def is_gnore_files(file):
    return file in gnore_files
# 是否文件类型
def is_file_type(type):
    return type in file_type
# 需要搜索的关键字
def init_readlinesfile():
    f = open("code_search/key_list.txt","r")
    lines = f.readlines() 
    global search_key
    for line in lines:
        search_key.append(line.replace('\n',''))
    print(search_key)
def insert_data_file():
    f = open(out_data_file_name,"w")
    for key in search_key:
        key_str="\n\n\n==============================关键字：{0}===================================".format(key)
        log_file_write(f,key_str+'\n')
        obj=search_key_data.get(key)
        if obj is None:
            log_file_write(f,"未找到数据")
            continue
        for file in obj:
            file_str="##文件名称：{0}".format(file)
            log_file_write(f,'\n'+file_str+'\n')
            value_list=obj[file]
            for item in value_list:
                log_file_write(f,item+'\n')
    f.close()

def log_file_write(f,value):
    print(value)
    f.write(value)
if __name__ == '__main__':
    init_readlinesfile()
    recursion_project(base_code_path)
    insert_data_file()
